home *** CD-ROM | disk | FTP | other *** search
- /***********************************************************
- Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
- Amsterdam, The Netherlands.
-
- All Rights Reserved
-
- Permission to use, copy, modify, and distribute this software and its
- documentation for any purpose and without fee is hereby granted,
- provided that the above copyright notice appear in all copies and that
- both that copyright notice and this permission notice appear in
- supporting documentation, and that the names of Stichting Mathematisch
- Centrum or CWI not be used in advertising or publicity pertaining to
- distribution of the software without specific, written prior permission.
-
- STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
- THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
- FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
- FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
- OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
- ******************************************************************/
-
- #include "yuv.h"
-
- void
- yuv_sv411_to_cl422dc(int invert, void *data, void *yuv, int width, int height)
- {
- struct yuv411 *in = data;
- struct yuv422 *out_even = yuv;
- struct yuv422 *out_odd = out_even + width / 2;
- int i, j; /* counters */
-
- for (i = height / 2; i--; ) {
- for (j = width / 4; j--; ) {
- YUV422_Y0(*out_even) = YUV411_Y00(*in);
- YUV422_U0(*out_even) = YUV411_U00(*in);
- YUV422_V0(*out_even) = YUV411_V00(*in);
- YUV422_Y1(*out_even) = YUV411_Y01(*in);
- out_even++;
- YUV422_Y0(*out_even) = YUV411_Y02(*in);
- YUV422_U0(*out_even) = YUV411_U02(*in);
- YUV422_V0(*out_even) = YUV411_V02(*in);
- YUV422_Y1(*out_even) = YUV411_Y03(*in);
- out_even++;
- YUV422_Y0(*out_odd) = YUV411_Y10(*in);
- YUV422_U0(*out_odd) = YUV411_U10(*in);
- YUV422_V0(*out_odd) = YUV411_V10(*in);
- YUV422_Y1(*out_odd) = YUV411_Y11(*in);
- out_odd++;
- YUV422_Y0(*out_odd) = YUV411_Y12(*in);
- YUV422_U0(*out_odd) = YUV411_U12(*in);
- YUV422_V0(*out_odd) = YUV411_V12(*in);
- YUV422_Y1(*out_odd) = YUV411_Y13(*in);
- out_odd++;
- in++;
- }
- out_even += width / 2;
- out_odd += width / 2;
- }
- }
-
- void
- yuv_sv411_to_cl422dc_quartersize(int invert, void *data, void *yuv,
- int width, int height)
- {
- int w4 = width / 4; /* quarter of width is used often */
- struct yuv411 *in_even = data;
- struct yuv411 *in_odd = in_even + w4;
- struct yuv422 *out_even = yuv;
- struct yuv422 *out_odd = out_even + w4;
- int i, j; /* counters */
- int u, v; /* U and V values */
-
- for (i = height / 4; i--; ) {
- for (j = w4; j--; ) {
- u = YUV411_U00(*in_even);
- v = YUV411_V00(*in_even);
-
- YUV422_Y0(*out_even) = YUV411_Y00(*in_even);
- YUV422_U0(*out_even) = u;
- YUV422_V0(*out_even) = v;
- YUV422_Y1(*out_even) = YUV411_Y02(*in_even);
-
- YUV422_Y0(*out_odd) = YUV411_Y10(*in_odd);
- YUV422_U0(*out_odd) = u;
- YUV422_V0(*out_odd) = v;
- YUV422_Y1(*out_odd) = YUV411_Y12(*in_odd);
-
- in_even++;
- in_odd++;
- out_even++;
- out_odd++;
- }
- in_even += w4;
- in_odd += w4;
- out_even += w4;
- out_odd += w4;
- }
- }
-
- void
- yuv_sv411_to_cl422dc_sixteenthsize(int invert, void *data, void *yuv,
- int width, int height)
- {
- int w4_3 = 3 * width / 4; /* three quarters of width is used often */
- int w8 = width / 8; /* and so is one eighth */
- struct yuv411 *in_even = data;
- struct yuv411 *in_odd = in_even + width / 2;
- struct yuv422 *out_even = yuv;
- struct yuv422 *out_odd = out_even + w8;
- int i, j; /* counters */
- int u, v; /* U and V values */
-
- for (i = height / 8; i--; ) {
- for (j = w8; j--; ) {
- u = YUV411_U00(in_even[0]);
- v = YUV411_V00(in_even[0]);
-
- YUV422_Y0(*out_even) = YUV411_Y00(in_even[0]);
- YUV422_U0(*out_even) = u;
- YUV422_V0(*out_even) = v;
- YUV422_Y1(*out_even) = YUV411_Y00(in_even[1]);
-
- YUV422_Y0(*out_odd) = YUV411_Y00(in_odd[0]);
- YUV422_U0(*out_odd) = u;
- YUV422_V0(*out_odd) = v;
- YUV422_Y1(*out_odd) = YUV411_Y00(in_even[1]);
-
- in_even += 2;
- in_odd += 2;
- out_even++;
- out_odd++;
- }
- in_even += w4_3;
- in_odd += w4_3;
- out_even += w8;
- out_odd += w8;
- }
- }
-